--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_integrity.py 2b854f7c5ceb18ccc463e89433dfecdcef61c439 (2b854f7c) Text, 3.71 KB
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787unittest
Tff7b72import T7ee787sqlite3
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787integrity_manager Tff7b72import Te6edf3IntegrityManager
Tff7b72class T56d364TestIntegrityManagerTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffsetUpTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftest_dir Tff7b72= Te6edf3PathTb4b4b4(Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdb_path Tff7b72= Tff7b72selfTff7b72.Td2a8fftest_dir Tff7b72/ Ta5d6ff"Ta5d6ffdatabase.dbTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffidentities_dir Tff7b72= Tff7b72selfTff7b72.Td2a8fftest_dir Tff7b72/ Ta5d6ff"Ta5d6ffidentitiesTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffidentities_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
T8b949e# Create a real SQLite database
Te6edf3conn Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE test (id INTEGER PRIMARY KEY)Ta5d6ff"Tb4b4b4)
Te6edf3connTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
T8b949e# Create a dummy identity
Tff7b72selfTff7b72.Td2a8ffid_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffidentities_dir Tff7b72/ Ta5d6ff"Ta5d6fftest_idTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffid_pathTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffid_path Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffdummy identity contentTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanager Tff7b72= Te6edf3IntegrityManagerTb4b4b4(Tff7b72selfTff7b72.Td2a8fftest_dirTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Tff7b72def Td2a8fftearDownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Tff7b72selfTff7b72.Td2a8fftest_dirTb4b4b4)
Tff7b72def Td2a8fftest_initial_runTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Test integrity check when no manifest exists."""
Te6edf3is_okTb4b4b4, Te6edf3issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffcheck_integrityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Te6edf3is_okTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffInitial runTa5d6ff"Tb4b4b4, Te6edf3issuesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8fftest_integrity_successTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Test integrity check matches saved state."""
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsave_manifestTb4b4b4(Tb4b4b4)
Te6edf3is_okTb4b4b4, Te6edf3issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffcheck_integrityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Te6edf3is_okTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3issuesTb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72def Td2a8fftest_database_tamperedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Test detection of database modification."""
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsave_manifestTb4b4b4(Tb4b4b4)
T8b949e# Modify DB in a way that breaks SQLite integrity or at least changes hash
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4, Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6fftamperedTa5d6ff"Tb4b4b4)
Te6edf3is_okTb4b4b4, Te6edf3issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffcheck_integrityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertFalseTb4b4b4(Te6edf3is_okTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Tffa657anyTb4b4b4(Ta5d6ff"Ta5d6ffDatabaseTa5d6ff" Tff7b72in Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3issuesTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Tffa657anyTb4b4b4(Ta5d6ff"Ta5d6ffLast integrity snapshotTa5d6ff" Tff7b72in Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3issuesTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_identity_mismatchTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Test detection of identity mismatch in manifest."""
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentity_hash Tff7b72= Ta5d6ff"Ta5d6fforiginal_hashTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsave_manifestTb4b4b4(Tb4b4b4)
T8b949e# Change identity hash
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentity_hash Tff7b72= Ta5d6ff"Ta5d6ffnew_hashTa5d6ff"
T8b949e# Tamper a file to trigger issues list which includes the metadata check
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4, Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffmore content to change hashTa5d6ff"Tb4b4b4)
Te6edf3is_okTb4b4b4, Te6edf3issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffcheck_integrityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertFalseTb4b4b4(Te6edf3is_okTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Tffa657anyTb4b4b4(Ta5d6ff"Ta5d6ffIdentity mismatchTa5d6ff" Tff7b72in Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3issuesTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Tffa657anyTb4b4b4(Ta5d6ff"Ta5d6ffManifest belongs to: original_hashTa5d6ff" Tff7b72in Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3issuesTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_identity_tamperedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Test detection of identity file modification."""
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsave_manifestTb4b4b4(Tb4b4b4)
T8b949e# Modify Identity
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffid_path Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6fftamperedTa5d6ff"Tb4b4b4)
Te6edf3is_okTb4b4b4, Te6edf3issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffcheck_integrityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertFalseTb4b4b4(Te6edf3is_okTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(
Tffa657anyTb4b4b4(
Ta5d6ff"Ta5d6ffCritical security componentTa5d6ff" Tff7b72in Te6edf3i Tff7b72or Ta5d6ff"Ta5d6ffFile signature mismatchTa5d6ff" Tff7b72in Te6edf3i
Tff7b72for Te6edf3i Tff7b72in Te6edf3issues
Tb4b4b4)
Tb4b4b4)
Tff7b72def Td2a8fftest_new_identity_detectedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Test detection of unauthorized new identity files."""
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffsave_manifestTb4b4b4(Tb4b4b4)
T8b949e# Add new identity
Te6edf3new_id Tff7b72= Tff7b72selfTff7b72.Td2a8ffidentities_dir Tff7b72/ Ta5d6ff"Ta5d6ffnew_idTa5d6ff"
Te6edf3new_idTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3new_id Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffunauthorizedTa5d6ff"Tb4b4b4)
Te6edf3is_okTb4b4b4, Te6edf3issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffcheck_integrityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertFalseTb4b4b4(Te6edf3is_okTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Tffa657anyTb4b4b4(Ta5d6ff"Ta5d6ffNew file detectedTa5d6ff" Tff7b72in Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3issuesTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3unittestTff7b72.Td2a8ffmainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────